package com.anivia.common.core.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.anivia.common.core.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;


/**
 * 自定义断言工具类
 *
 * @author wangj
 */
@Slf4j
public class AssertUtil {
    /**
     * 断言对象是否为null。如果对象不为null，则抛出BusinessException。
     *
     * @param obj 被检查的对象
     * @param msg 异常信息，当对象不为null时，将此信息作为异常消息
     */
    public static void isNull(Object obj, String msg) {
        if (obj != null) {
            throw new BusinessException(msg);
        }
    }


    /**
     * 断言对象是否不为null，如果为null，则抛出异常
     *
     * @param obj 被检查的对象
     * @param msg 异常信息，当对象为null时，将此信息作为异常消息
     */
    public static void notNull(Object obj, String msg) {
        if (obj == null) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言表达式是否为true，如果为false，则抛出异常
     *
     * @param expression 被检查的表达式
     * @param msg        异常信息，当表达式为false时，将此信息作为异常消息
     */
    public static void isTrue(boolean expression, String msg) {
        if (!expression) {
            throw new BusinessException(msg);
        }
    }


    /**
     * 断言表达式是否为false，如果为true，则抛出异常
     *
     * @param expression 被检查的表达式
     * @param msg        异常信息，当表达式为true时，将此信息作为异常消息
     */
    public static void isFalse(boolean expression, String msg) {
        if (expression) {
            throw new BusinessException(msg);
        }
    }


    /**
     * 检查给定字符串是否为空白（null、空串或只包含空白字符），若为空则抛出异常
     *
     * @param text 被检查的字符串
     * @param msg  异常信息，当字符串为空时，将此信息作为异常消息
     */
    public static void notBlank(CharSequence text, String msg) {
        if (StrUtil.isBlank(text)) {
            throw new BusinessException(msg);
        }
    }


    /**
     * 检查给定字符串是否为空，若为空则抛出异常
     *
     * @param text 被检查的字符串
     * @param msg  异常信息，当字符串为空时，将此信息作为异常消息
     */
    public static void notEmpty(CharSequence text, String msg) {
        if (StrUtil.isEmpty(text)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言字符串是否不包含另一个字符串包含，包含则抛出异常
     *
     * @param text      完整字符串
     * @param substring 要断言的子串
     * @param msg       异常信息
     */
    public static void notContain(CharSequence text, CharSequence substring, String msg) {
        if (StrUtil.contains(text, substring)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言字符串是否包含另一个字符串包含，不包含则抛出异常
     *
     * @param text      完整字符串
     * @param substring 要断言的子串
     * @param msg       异常信息
     */
    public static void contain(CharSequence text, CharSequence substring, String msg) {
        if (!StrUtil.contains(text, substring)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言两个对象是否相等,如果两个对象不相等，则抛出异常
     *
     * @param obj1 被检查的对象1
     * @param obj2 被检查的对象2
     * @param msg  异常信息
     */
    public static void equals(Object obj1, Object obj2, String msg) {
        if (ObjectUtil.notEqual(obj1, obj2)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言两个对象是否不相等,如果两个对象相等，则抛出异常
     *
     * @param obj1 被检查的对象1
     * @param obj2 被检查的对象2
     * @param msg  异常信息
     */
    public static void notEquals(Object obj1, Object obj2, String msg) {
        if (ObjectUtil.equals(obj1, obj2)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言Map非空,为空则抛出异常
     *
     * @param map 被检查的map
     * @param msg 异常信息
     */
    public static void notEmpty(Map map, String msg) {
        if (MapUtil.isEmpty(map)) {
            throw new BusinessException(msg);
        }
    }

    /**
     * 断言集合非空,为空则抛出异常
     *
     * @param collection 被检查的集合
     * @param msg        异常信息
     */
    public static void notEmpty(Iterable collection, String msg) {
        if (CollUtil.isEmpty(collection)) {
            throw new BusinessException(msg);
        }
    }
}
